package com.heima.article.controller;

import com.heima.article.entity.ApArticle;
import com.heima.article.es.ApArticleSearch;
import com.heima.article.es.ApArticleSearchRepository;
import com.heima.article.service.IApArticleService;
import com.heima.common.dto.ResponseResult;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/test/es")
public class TestController {

    @Autowired
    ElasticsearchRestTemplate elasticsearchRestTemplate; // es 搜索引擎

    @Autowired
    IApArticleService articleService; // 文章数据表

    @Autowired
    ApArticleSearchRepository searchRepository; // es仓库接口


    /**
     * 创建 es 索引库
     * @return
     */
    @GetMapping("/index")
    public ResponseResult createIndex(){
        // es 搜索引擎 直接创建索引库
        elasticsearchRestTemplate.createIndex(ApArticleSearch.class);
        // 返回成功标志
        return ResponseResult.okResult("索引库创建成功!");
    }

    /**
     * 添加 es 映射关系
     * @return
     */
    @GetMapping("/putMapping")
    public ResponseResult putMapping(){
        // es 搜索引擎 直接添加映射关系
        boolean mapping = elasticsearchRestTemplate.putMapping(ApArticleSearch.class);
        // 返回成功标志
        return ResponseResult.okResult(mapping);
    }

    /**
     * 保存文章列表到es
     * @return
     */
    @GetMapping("/addDoc")
    public ResponseResult addDoc(){
        // mysql中查询文章列表 , 文章数据表进行查询
        List<ApArticle> articles = articleService.list();
        // 遍历数据
        for (ApArticle article : articles) {
            // 创建 es 文章信息表对象
            ApArticleSearch search = new ApArticleSearch();
            // 进行数据copy
            BeanUtils.copyProperties(article, search);
            // 保存到es中, 创建条件
            IndexQuery query = new IndexQuery();
            // 写入id
            query.setId(search.getId().toString());
            // 写入对象
            query.setObject(search);
            // es 搜索引擎 进行文档添加,保存
            elasticsearchRestTemplate.index(query);
        }
        // 返回成功标志
        return ResponseResult.okResult("添加文档成功");
    }

    /**
     * 删除所有
     * @return
     */
    @GetMapping("/del")
    public ResponseResult deleteAll(){
        // 调用仓库接口, 进行删除操作
        searchRepository.deleteAll();
        // 删除完成, 返回成功标志
        return ResponseResult.okResult("删除操作完成!");
    }

    @GetMapping("/add")
    public ResponseResult addAll(){
        // mysql中查询文章列表 , 文章数据表进行查询
        List<ApArticle> articles = articleService.list();
        // 创建es 文章信息表 集合
        List<ApArticleSearch> searches = new ArrayList<>();
        // 遍历
        for (ApArticle article : articles) {
            // 创建 es 文章信息表对象
            ApArticleSearch search = new ApArticleSearch();
            // 进行数据copy
            BeanUtils.copyProperties(article, search);
            // 添加到 es文章表集合
            searches.add(search);
        }
        // 仓库接口进行添加操作
        searchRepository.saveAll(searches);
        // 添加成功, 返回成功标志
        return ResponseResult.okResult("仓库接口, 添加所有成功");
    }


}
